﻿#pragma once
#include "MaskBase.h"
#include <algorithm>
#include <iostream>
#include <cstdlib>

//重载()，为了map存储
struct CvPointCompare {
	bool operator()(const std::vector<cv::Point>& lhs, const std::vector<cv::Point>& rhs) const {
		if (lhs.size() != rhs.size()) return lhs.size() < rhs.size();
		for (size_t i = 0; i < lhs.size(); ++i) {
			if (lhs[i].x != rhs[i].x) return lhs[i].x < rhs[i].x;
			if (lhs[i].y != rhs[i].y) return lhs[i].y < rhs[i].y;
		}
		return false;
	}
};

class Focus : public MaskBase
{	
public:
	Focus();
	~Focus();

	virtual cv::Point2f getMaskCenter(cv::Mat &mat); //获取图像中心
	virtual int preprocess(cv::Mat& mat, Attribute& attr); //对图像进行预处理
	virtual int findMaxOutline(cv::Mat& mat); //寻找图中最大轮廓（已经废弃）
	virtual int findMaxOutline(cv::Mat& mat, Attribute& attr); //寻找图中符合条件的轮廓
	virtual int draw(cv::Mat &mat, Attribute& attr); //拟合轮廓并绘画
	virtual cv::Point2f getMaxOutlineCenter(Attribute& attr) const; //获取图中最终或者目标轮廓的中心
	virtual int drawCross(cv::Mat &mat, cv::Point2f center , const size_t crosslen); //在途中指定位置画十字中心
	virtual double CalculatePTOPDistance(cv::Point2f center1); //计算图中指定位置与轮廓圆心的距离
	virtual double CalculatePTOPDistance(cv::Point2f center1, cv::Point2f center2); //计算图中指定位置与指定位置的距离
	virtual bool isCover(double distance, const double threshold); //判断计算出的距离是否在给定的阈值范围之内
	std::vector<std::vector<cv::Point>> getContours() const; //获取已经寻找到满足条件的所有轮廓

private:
	int drawCircle(cv::Mat &mat); //拟合圆并绘画
	int drawRect(cv::Mat &mat); //拟合矩形并绘画
	int fit(cv::Mat &mat, Attribute& attr, std::vector<cv::Point> & contour, Params &param, std::vector<std::vector<cv::Point>> &result); //根据指定的形状进行拟合
private:
	std::vector<cv::Point> maxcontour_; //最终目标轮廓
	Shape shape; //形状
	cv::Point2f maskcenter_; //图像的中心
	std::vector<std::vector<cv::Point>> contours_; //符合条件的所有轮廓
	std::map<std::vector<cv::Point>, float, CvPointCompare> circlemap_; //圆形轮廓 --> 半径 
	std::map<std::vector<cv::Point>, std::pair<double, double>, CvPointCompare> rectmap_; //矩形轮廓 --> (宽，高)

};

